package com.by.service.impl;

import com.by.bean.Dept;
import com.by.bean.DeptTree;
import com.by.common.crud.BaseServiceImpl;
import com.by.common.query.DeptQuery;
import com.by.mapper.DeptMapper;
import com.by.service.DeptService;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author Ye QS
 * @version 0.1
 * @className DeptServiceImpl
 * @description
 * @date 2024/9/9 10:20
 * @since jdk11
 */
@Service
public class DeptServiceImpl extends BaseServiceImpl<Dept, DeptMapper> implements DeptService {

    /**
     * 保存部门信息
     *
     * @param entity 部门实体对象
     * @return 影响的行数
     */
    @Override
    public int save(Dept entity) {
        // 生成部门编号并设置到entity中
        entity.setDeptCode(generateDeptCode(entity.getParentId()));

        // 调用基类方法完成实际的数据持久化操作
        return super.save(entity);
    }

    /**
     * 生成新的部门编号
     *
     * @param parentId 父部门ID
     * @return 新的部门编号字符串
     */
    private String generateDeptCode(int parentId) {
        // 获取当前父部门下的最大部门编号
        String maxCode = baseMapper.queryMaxCode(parentId);

        if (maxCode == null) {  // 如果不存在子部门，则根据parentId的不同情况初始化新部门号
            if (parentId == 0) {
                // 根部门，初始编号为101
                return "101";
            }

            // 普通部门，基于其父部门编号追加后缀"01"
            String parentCode = baseMapper.queryCodeById(parentId);
            return parentCode + "01";
        }

        // 已存在子部门的情况下，在现有最大编号基础上递增一位
        Integer tmp = Integer.parseInt(maxCode);
        tmp++;
        return String.valueOf(tmp);  // 将整型转换回字符串形式返回
    }

    @Override
    public int delete(Serializable id) {
        //查询子部门
        int i = baseMapper.queryChildCount(id);
        if (i > 0) {
            return 2; //说明有子部门不让删除
        }
        return super.delete(id);
    }

    /**
     * 查询部门树
     *
     * @return
     */
    @Override
    public List<DeptTree> queryTree() {
        return baseMapper.queryTree(0);
    }

    @Override
    public int updateStatus(int id, int status) {
        return baseMapper.updateStatus(id, status);
    }

    @Override
    public List<Map> queryChiLdDept(DeptQuery query) {
        return baseMapper.queryChiLdDept(query);
    }
}